package basis.netease.hard;

import java.util.HashMap;
import java.util.Scanner;

/**
 * 7-9 最长超赞子字符串
 * 给你一个字符串 s 。请返回 s 中最长的 超赞子字符串 的长度。
 * 「超赞子字符串」需满足满足下述两个条件：
 * 该字符串是 s 的一个非空子字符串
 * 进行任意次数的字符交换后，该字符串可以变成一个回文字符串
 * 1 <= s.length <= 10^5
 * s 仅由数字组成
 * 输入格式:
 * 输入一行只包含数字的字符串s
 * 输出格式:
 * 输出s中最长的 超赞子字符串 的长度
 * 输入样例:
 * 在这里给出一组输入。例如：
 * 3242415
 * 输出样例:
 * 在这里给出相应的输出。例如：
 * 5
 * "24241" 是最长的超赞子字符串，交换其中的字符后，可以得到回文 "24142"
 */
public class Main_9 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        System.out.println(longestAwesome(input));
    }

    public static int longestAwesome(String s) {
        // mask二进制后的第i位为1表示数字i出现了奇数次，为0表示数字i未出现或者偶数次。
        int mask = 0;
        // 记录每种mask值第一次出现的位置
        HashMap<Integer, Integer> seen = new HashMap<>();
        seen.put(0, -1);
        int maxLen = 0;
        for (int i = 0; i < s.length(); i++) {
            // 更新当前状态
            mask ^= (1 << (s.charAt(i) - '0'));
            // 如果之前出现过相同的状态，则更新最大长度
            if (seen.containsKey(mask)) {
                maxLen = Math.max(maxLen, i - seen.get(mask));
            } else  {
                seen.put(mask, i);
            }
            // 检查所有可能的奇数位情况
            for (int j = 0; j < 10; j++) {
                int testMask = mask ^ (1 << j);
                if (seen.containsKey(testMask)) {
                    maxLen = Math.max(maxLen, i - seen.get(testMask));
                }
            }
        }
        return maxLen;
    }

}
